import axios from 'axios'
import store from '@/store'
import globalConfig from '@/config'
import { getToken } from '@/libs/token'
import { MessageBox, Notification } from 'element-ui'

// 是否显示重新登录
export const isReLogin = { show: false }
// 响应拦截器
let avoidDuplication = false

// POST 请求头
axios.defaults.headers.post['Content-Type'] =
	'application/x-www-form-urlencoded'
// 请求基础 URL
axios.defaults.baseURL = globalConfig.baseContext
// 请求携带cookie
axios.defaults.withCredentials = true

// 创建axios实例
const service = axios.create()

// request拦截器
service.interceptors.request.use(
	(res) => {
		// 是否需要设置 token
		const isToken = res.headers.isToken !== false
		console.log('isToken = ' + isToken)
		if (getToken() && isToken) {
			// 让每个请求携带自定义token 请根据实际情况自行修改
			res.headers['satoken'] = getToken()
		}
		return res
	},
	(error) => {
		console.log('error---------------->')
		console.log(error)
		console.log('error---------------->')
		return Promise.reject(error)
	}
)

// response拦截器
service.interceptors.response.use(
	(res) => {
		// 二进制数据则直接返回
		if (
			res.request.responseType === 'blob' ||
			res.request.responseType === 'arraybuffer'
		) {
			return res.data
		}
		if (res.data.message === '用户未登录') {
			if (isReLogin.show) {
				isReLogin.show = true
				MessageBox.confirm('登录状态已过期，请重新登录', '系统提示', {
					confirmButtonText: '重新登录',
					type: 'warning'
				})
					.then(() => {
						isReLogin.show = false
						store.dispatch('logout').then(() => {
							location.href = '/netdisk/login'
						})
					})
					.catch(() => {
						isReLogin.show = false
					})
			}
			return Promise.reject('用户未登录~~~~~~~~~~~~~~~')
		}
		if (res.status === 200) {
			return Promise.resolve(res.data)
		}
	},
	(error) => {
		// 防止失效导致出现多个提示框的解决办法
		if (!avoidDuplication) {
			avoidDuplication = true
			if (error.response.status) {
				console.log('error---------------->')
				console.log(error)
				console.log('error---------------->')
				switch (error.response.status) {
					case 404:
						Notification.warning('接口不存在，请刷新重试或联系管理员')
						break
					case 500:
						Notification.error('服务异常，请刷新重试或联系管理员')
						break
					case 502:
						Notification.error('服务异常，请刷新重试或联系管理员')
						break
					default:
						Notification.warning(error.response.data.message)
						return Promise.reject(error.response)
				}
			}
		}
	}
)

export default service
